//
// Created by denglibin on 2021/4/8.
//

#ifndef OPENGL_MINGW_MODEL_H
#define OPENGL_MINGW_MODEL_H

#include "../Shader.h"
#include "Mesh.h"
#include "assimp/scene.h"
unsigned int TextureFromFile(const char *path, const string &directory, bool gamma = false);
/**
 * 模型类
 */
class Model {

public:
    Model(const char *path);
    /**
     * 绘制
     * @param shader
     */
    void Draw(Shader& shader);
private:
    //已经加载的纹理
    vector<Texture> textures_loaded;
    /*  模型数据  */
    vector<Mesh> meshes;
    string directory;
    /**
     * 从文件加载模型
     */
    void loadModel(string path);
    /**
     * 处理节点
     * @param node
     * @param scene
     */
    void processNode(aiNode *node, const aiScene *scene);
    /**
     * 将一个aiMesh对象转化为我们自己的网格对象
     * @param mesh
     * @param scene
     * @return
     */
    Mesh processMesh(aiMesh *mesh, const aiScene *scene);
    /**
     * 遍历给定纹理类型的所有纹理位置，获取了纹理的文件位置，并加载并和生成了纹理，将信息储存在了一个Vertex结构体中
     * @param mat
     * @param type
     * @param typeName
     * @return
     */
    vector<Texture> loadMaterialTextures(aiMaterial *mat, aiTextureType type,
                                         string typeName);

};


#endif //OPENGL_MINGW_MODEL_H
